home *** CD-ROM | disk | FTP | other *** search
- /*
- *
- * ImageMaker for OBERON written jul-91 by Matthias Scherrer
- *
- * usage: ImageMaker brushname
- *
- * brushname: a brush-file (DPaint)
- *
- *
- */
-
- #include <stdio.h>
- #include <exec/types.h>
- #include <exec/memory.h>
- extern void *AllocMem();
-
- struct BMHD
- {
- UWORD Width,Height;
- WORD LeftEdge,TopEdge;
- UBYTE Depth;
- UBYTE Mask;
- UBYTE Compression;
- UBYTE pad1;
- UWORD transparentColor;
- UBYTE xAspect,yAspect;
- WORD pageWidth,pageHeight;
- } BMHeader;
-
- struct Image
- {
- SHORT LeftEdge,TopEdge;
- SHORT Width,Height,Depth;
- SHORT *ImageData;
- UBYTE PlanePick,PlaneOnOff;
- struct Image *NextImage;
- } Brush;
-
- BYTE imagename[40],imagefile[40];
- UBYTE *imagedata=0;
- UWORD *data;
- WORD sp;
- LONG i,j;
- ULONG mem;
- FILE *fp;
-
- main (argc,argv)
- SHORT argc;
- BYTE *argv[];
- {
- SHORT x,y,z;
-
- if(argc<2 || argc>2 || *argv[1]=='?')
- exit(
- puts("Usage: ImageMaker <brushname>"));
-
- if(!strcmp(argv[1],"-s")) argv[1]=argv[2];
-
- for(i=strlen(argv[1])-1;i>=0;i--)
- if(*(argv[1]+i)==':' || *(argv[1]+i)=='/') break;
- sprintf(imagename,"%s",argv[1]+i+1);
-
- printf("Loading Brush %s...",argv[1]);
- LoadBrush(argv[1]);
- Brush.ImageData=(SHORT *)imagedata;
- Brush.Width=BMHeader.Width;
- Brush.Height=BMHeader.Height;
- Brush.Depth=BMHeader.Depth;
- Brush.PlanePick=(1<<BMHeader.Depth)-1;
-
- data=(UWORD *)imagedata;
- x=Brush.Width/16+(Brush.Width%16>0);
- y=Brush.Height;
- z=Brush.Depth;
-
-
- printf("\n\nConverting to file %s.mod\n\n",&imagename[0]);
-
- sprintf(imagefile,"%s.mod",argv[1]);
- if(!(fp=fopen(imagefile,"w")))
- exit(printf("Can't open file '%s' for write.\n",argv[2]));
-
- fprintf(fp,"MODULE XYZ;\n");
- fprintf(fp,"\nIMPORT s:SYSTEM, i:Intuition;\n");
- fprintf(fp,"\n(* $DataChip+ *)\n");
- fprintf(fp,"\n(* Image: %d*%d*%d (Width,Height,Depth) *)\n",
- Brush.Width,Brush.Height,Brush.Depth);
- fprintf(fp,"\nTYPE %sArr = ARRAY %d OF INTEGER;\n",imagename,
- ((Brush.Width+15)/16)*Brush.Height*Brush.Depth);
- fprintf(fp,"\n");
- fprintf(fp,"\nCONST %s = %sArr(\n",imagename,imagename);
-
- for(j=0;j<z;j++)
- {
- for(i=0;i<x*y;i++)
- {
- fprintf(fp,"\n");
- sp=data[i+j*x*y];
- fprintf(fp," %7d,",sp);
- sp=data[++i+j*x*y];
- fprintf(fp," %7d",sp);
- if(i+1<x*y) fprintf(fp,",");
- }
- if (j+1<z) fprintf(fp,",\n");
- }
- fprintf(fp,");\n\n");
- fprintf(fp,"VAR %sAdr* : i.ImagePtr;\n",imagename);
- fprintf(fp,"\nBEGIN\n");
- fprintf(fp," %sAdr:=s.ADR(%s);\n",imagename,imagename);
- fprintf(fp,"END XYZ.\n\n");
-
- fclose(fp);
- FreeMem(imagedata,mem);
- }
-
- LoadBrush(name)
- char *name;
- {
- BYTE c2;
- UBYTE *ptr;
- SHORT c,ct,ct2;
- UWORD BWidth,BHeight,BDepth;
-
- if(!(fp=fopen(name,"r")))
- exit(printf("Can't read '%s'.\n",name));
-
- if(!SearchHeader(fp,"ILBMBMHD"))
- exit(fclose(fp),printf("Not an IFF-File.\n"));
-
- ptr=(UBYTE *)&BMHeader;
- for(i=0;i<20;i++) *(ptr++)=getc(fp);
- BWidth=((BMHeader.Width+15)/16)*2;
-
- if(!(imagedata=AllocMem(mem=(ULONG)
- (BWidth*BMHeader.Height*BMHeader.Depth),MEMF_CHIP)))
- exit(fclose(fp),printf("Not enough CHIP-RAM!\n"));
-
- if(!SearchHeader(fp,"BODY"))
- exit(fclose(fp),
- FreeMem(imagedata,mem),
- printf("Not an IFF-File.\n"));
-
- for(BHeight=0;BHeight<BMHeader.Height;BHeight++)
- {
- for(BDepth=0;BDepth<BMHeader.Depth;BDepth++)
- {
- ptr=imagedata+BDepth*BWidth*BMHeader.Height+BHeight*BWidth;
- ct2=0;
- if(!BMHeader.Compression)
- while(ct2++<BWidth) *ptr++=getc(fp);
- else
- {
- while(ct2<BWidth)
- {
- c=getc(fp);
- if(c<=128)
- {
- ct=c+1;
- for(i=0;i<ct;i++){ *ptr++=getc(fp); ct2++; }
- }
- else
- {
- ct=256-c+1;
- c2=getc(fp);
- for(i=0;i<ct;i++){ *ptr++=c2; ct2++; }
- }
- }
- }
- }
- }
- fclose(fp);
- }
-
- SearchHeader(fp,iffheader)
- FILE *fp;
- UBYTE *iffheader;
- {
- SHORT c;
- UBYTE *cp=iffheader;
-
- while((c=getc(fp))!=EOF)
- {
- if(c==*cp){cp++;if(!*cp) break; }
- else cp=iffheader;
- }
- if (c==EOF) return(0);
- else { for(i=0;i<4;i++) getc(fp); return(1); }
- }
-
-
-